MetonaAI-Desktop 架构与交互设计

基于「生产级通用 AI Agent 桌面应用构建指南」+「Metona 内部 IR 标准」,定义完整的系统架构、9 个基础工具、4 个用户级磁盘文件、工作空间机制、数据库配置规范及全链路可追踪日志体系。

版本: v1.0.0 技术栈: React + Electron + SQLite 日期: 2026-06-26
📋 文档层级:本文档是 工作空间、9 个基础工具、4 个磁盘文件、数据库配置的权威定义,与《构建指南》第三、五、六章对应。冲突时以本文档为准。

📋 设计总览

MetonaAI-Desktop 是一个运行在用户本地桌面上的通用 AI Agent 应用。它以工作空间(Workspace)为基本组织单元, 通过 4 个 Markdown 磁盘文件 定义 Agent 的灵魂、行为、记忆和用户画像, 提供 9 个基础工具 赋予 Agent 操作文件系统、网络、记忆和命令行的能力。 全链路操作透明可追踪,所有决策过程、工具调用、LLM 推理记录在本地 SQLite 日志中。

┌──────────────────────────────────────────────────────────┐
│                   MetonaAI-Desktop                        │
│                                                          │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌─────────┐ │
│  │ SOUL.md  │  │ AGENTS.md│  │ MEMORY.md│  │ USERS.md│ │  ← 用户磁盘文件
│  └────┬─────┘  └────┬─────┘  └────┬─────┘  └────┬────┘ │
│       │             │             │             │       │
│  ┌────▼─────────────▼─────────────▼─────────────▼────┐  │
│  │              Agent Engine (ReAct Loop)             │  │
│  │    INIT → THINKING → PARSING → EXECUTING → OBSERVING → REFLECTING → COMPRESSING → TERMINATED  │  │
│  └────┬──────────────────────────────────────────────┘  │
│       │                                                 │
│  ┌────▼──────────────────────────────────────────────┐  │
│  │         9 Base Tools (统一 IR)                      │  │
│  │  read_file | write_file | list_dir | search_files   │  │
│  │  web_search | web_extract                          │  │
│  │  memory_store | memory_search                      │  │
│  │  run_command                                       │  │
│  └────┬──────────────────────────────────────────────┘  │
│       │                                                 │
│  ┌────▼──────────────────────────────────────────────┐  │
│  │  Trace & Audit Logger (全链路 SQLite)               │  │
│  └───────────────────────────────────────────────────┘  │
└──────────────────────────────────────────────────────────┘

🏗️ 系统架构

进程架构

进程运行时职责
Main ProcessNode.jsAgent 引擎、工具调度、数据库、MCP 管理、配置加载
Preload Script沙箱 Node通过 contextBridge 安全暴露 API 给渲染进程
RendererChromiumReact UI:聊天界面、Agent 监控、设置面板、Trace Viewer

四层 Harness 架构

层级名称核心模块使用的 IR 类型
L1推理与编排层ReAct Loop 状态机、Plan Mode 执行器、SubAgent 编排器MetonaRequest / MetonaResponse / MetonaStreamEvent
L2上下文与记忆层Context Builder、MemorySystem(SQLite)MetonaContext / MetonaMemoryItem
L3工具与安全执行层Tool Registry、Sandbox Manager、Policy Engine、MCP AdapterMetonaToolDef / MetonaToolCall / MetonaToolResult
L4支撑与基础架构层Config Manager、Logging System、OTel Tracing、Error BoundaryMetonaError / 内置类型

📁 工作空间(Workspace)

工作空间是 Metona 的组织核心。每个工作空间是一个本地磁盘目录,包含该上下文的全部文件。 Agent 启动时加载工作空间下的配置/状态文件,所有工具操作默认限制在工作空间内。

默认工作空间

📍 默认路径:~/MetonaWorkspaces/default/
首次启动时自动创建。用户可在设置界面修改默认路径或为不同项目创建独立工作空间。

自定义工作空间

用户可通过以下方式选择自定义工作空间目录:

  • 启动时选择:应用启动界面的"选择工作空间"按钮
  • 菜单切换:菜单栏 → 文件 → 打开/创建工作空间
  • 拖拽导入:将文件夹拖入应用窗口
  • 命令行参数metona --workspace /path/to/dir

工作空间目录结构

# ~/MetonaWorkspaces/my-project/
├── SOUL.md          # [必需] AI 灵魂定义 — 角色、性格、核心价值观(用户自定义)
├── AGENTS.md        # [必需] AI 行为定义 — 规则、边界、工作流(用户自定义)
├── MEMORY.md        # [必需] AI 持久记忆 — 跨会话保留的知识(Agent 维护 + 用户编辑)
├── USERS.md         # [必需] 用户画像 — 背景、技能、偏好(用户自定义)
├── logs/              # [自动创建] 会话日志(每次对话一个 .jsonl)
├── traces/            # [自动创建] 执行追踪(每次 ReAct 迭代一条 trace)
├── .metona/           # [自动创建] Metona 内部目录
│   └── agent.db       # SQLite 数据库(配置、记忆、审计日志、会话记录)
└── src/               # [可选] 用户项目文件(Agent 可读写)

必需文件说明

文件状态缺失时处理说明
SOUL.md必需自动创建空文件,Agent 以通用模式运行定义 Agent 身份和价值观
AGENTS.md必需自动创建空文件,使用内置最小安全规则定义 Agent 行为规则
MEMORY.md必需自动创建带元数据头的规范文件跨会话记忆(有严格格式要求)
USERS.md必需自动创建空文件,Agent 以通用模式运行用户画像信息
✅ 自动创建策略:打开工作空间时,Metona 会校验 4 个必需文件是否存在。
任何文件缺失都会自动创建,不会阻止启动。创建后提示用户编辑自定义内容。
MEMORY.md 创建时会自动包含符合格式规范的元数据头。

工作空间生命周期

1用户选择/创建工作空间目录(或使用默认路径 ~/MetonaWorkspaces/default/
2校验必需文件,缺失则自动创建(MEMORY.md 带元数据头)
3加载 4 个磁盘文件,构建 System Prompt(空文件不影响启动)
4连接 .metona/agent.db,加载配置、恢复历史会话
5Agent 就绪,开始对话。所有工具操作默认以工作空间为根
6会话结束后,MEMORY.md(更新时间戳)和 .metona/agent.db 自动更新

💾 数据库配置:.metona/agent.db

所有运行时配置存储在工作空间的 SQLite 数据库中(.metona/agent.db),而非外部配置文件。 这确保了配置与工作空间的强绑定,支持事务性更新和版本迁移。

💡 设计决策:采用数据库存储配置而非 YAML/JSON 文件,原因:
1. 配置与工作空间数据原子性一致
2. 支持并发访问和事务保护
3. 统一备份和迁移策略
4. 避免文件格式解析错误

配置表结构

-- .metona/agent.db > app_config
CREATE TABLE app_config (
    key         TEXT PRIMARY KEY,
    value       TEXT NOT NULL,        -- JSON 格式值
    category    TEXT NOT NULL,        -- llm | agent | tools | security | logging | mcp
    updated_at  TEXT DEFAULT (datetime('now'))
);

-- 配置分类索引
CREATE INDEX idx_config_category ON app_config(category);

配置项一览

分类类型默认值说明
llmproviderstring"deepseek"LLM 提供商
modelstring"deepseek-v4-pro"模型名称
apiKeystring""API 密钥(加密存储)
baseURLstring""API 基础 URL
paramsJSON{temperature:0, maxTokens:8192}生成参数
fallbackProviderstring""备选 LLM 提供商(故障转移)
fallbackModelstring""备选模型名称
agentmaxIterationsnumber20最大迭代次数
totalTimeoutMsnumber600000总超时(毫秒)
enableThinkingbooleantrue启用思考模式
thinkingEffortstring"high"思考强度: low/medium/high/max
toolsfilesystem.enabledbooleantrue文件系统工具开关
web.enabledbooleantrue网络工具开关
command.enabledbooleantrue命令工具开关
securityrequireWriteConfirmationbooleantrue写操作需确认
maxFileWriteSizeKBnumber1024最大写入文件大小
promptInjectionDefensebooleantrue注入防护开关
logginglevelstring"info"日志级别
auditEnabledbooleantrue审计日志开关
traceEnabledbooleantrue追踪日志开关

MCP Server 配置表

-- .metona/agent.db > mcp_servers
CREATE TABLE mcp_servers (
    id          TEXT PRIMARY KEY,
    name        TEXT NOT NULL UNIQUE,
    transport   TEXT CHECK(transport IN ('stdio', 'sse')),
    command     TEXT,                    -- stdio 模式的命令
    args        TEXT,                    -- JSON 数组格式的参数
    url         TEXT,                    -- SSE 模式的 URL
    enabled     BOOLEAN DEFAULT TRUE,
    created_at  TEXT DEFAULT (datetime('now')),
    updated_at  TEXT DEFAULT (datetime('now'))
);
🔧 配置管理:用户通过设置界面修改配置,变更即时生效并持久化到数据库。 首次创建工作空间时,系统自动插入所有配置项的默认值。

📊 9 个基础工具 — 总表

所有工具使用 Metona IR 的 MetonaToolDef / MetonaToolCall / MetonaToolResult 结构。内置在 Tool Registry 中,Adaper 为 LLM 生成 JSON Schema 格式的描述。

#工具名分类风险需确认核心功能
1read_filefilesystemSAFE读取文件内容,支持分页
2write_filefilesystemMEDIUM是(可配)写入/覆盖/追加文件内容
3list_directoryfilesystemSAFE列出目录内容
4search_filesfilesystemSAFE按模式搜索文件(名称/内容)
5web_searchnetworkLOW网络搜索,返回结果列表
6web_extractnetworkLOW抓取网页内容转 Markdown
7memory_storedatabaseMEDIUM存储一条记忆到 SQLite
8memory_searchdatabaseSAFE检索记忆(关键词匹配)
9run_commandcode_executionHIGH执行 Shell 命令,沙箱限制

📄 类别一:文件系统工具(4个)

1. read_file

读取文件完整内容。支持行偏移和行数限制,自动检测二进制文件。文件超过 100K 字符时返回截断提示。

参数类型必填说明
file_pathstring必填文件路径(相对于工作空间)
offsetnumber可选起始行号(1-indexed,默认 1)
limitnumber可选最大行数(默认 500,最大 2000)
💡 返回格式:{ content, total_lines, truncated, file_size }。truncated=true 时须提示用户指定 offset 继续读取。

2. write_file

写入内容到文件。默认覆盖模式,支持追加。写操作前校验路径白名单,默认需用户确认。

参数类型必填说明
file_pathstring必填目标文件路径
contentstring必填写入内容
modestring可选"overwrite"(默认)/ "append"

3. list_directory

列出目录内容,支持递归深度控制和 glob 过滤。

参数类型必填说明
dir_pathstring可选目录路径(默认工作空间根)
depthnumber可选递归深度(默认 1,最大 5)
globstring可选文件名过滤 (如 "*.ts")

4. search_files

在目录中按正则/glob 搜索文件内容或文件名。底层使用 ripgrep。

参数类型必填说明
patternstring必填搜索正则或 glob 模式
targetstring可选"content"(默认)/ "files"
pathstring可选搜索目录(默认工作空间根)
file_globstring可选限定文件名(如 "*.py")
limitnumber可选最大结果数(默认 50)

🌐 类别二:网络搜索与抓取(2个)

5. web_search

执行网络搜索,返回标题、摘要和 URL。支持搜索运算符(site:、filetype: 等)。

参数类型必填说明
querystring必填搜索关键词(支持 site:domain filetype:pdf 等)
limitnumber可选结果数(默认 5,最大 100)

6. web_extract

抓取网页内容并转换为 Markdown。支持 HTML 页面和 PDF 链接。超过 5000 字符自动摘要。

参数类型必填说明
urlsstring[]必填待抓取的 URL 列表(最多 5 个)

🧠 类别三:记忆工具(2个)

7. memory_store

将一条内容存入持久记忆。写入 SQLite,支持关键词检索。Agent 可在对话中保存重要信息。

参数类型必填说明
contentstring必填记忆内容
typestring必填"episodic"(情节)/ "semantic"(语义)/ "working"(工作)
importancenumber可选重要程度 0-1(默认 0.5)
sourcestring可选来源标识(默认 "agent")
tagsstring[]可选标签列表

8. memory_search

检索记忆库:关键词精确匹配,返回相关性排序结果。

参数类型必填说明
querystring必填搜索关键词或语义查询
typestring可选过滤记忆类型
topKnumber可选返回结果数(默认 5)
thresholdnumber可选相似度阈值(默认 0.7)

⚒️ 类别四:命令工具(1个)

9. run_command

在沙箱环境中执行 Shell 命令。命令在工作空间目录下运行,有超时限制和输出截断。高危命令需用户确认。

参数类型必填说明
commandstring必填Shell 命令
workdirstring可选执行目录(默认工作空间根)
timeoutnumber可选超时毫秒(默认 120000)
⚠ 安全规则(命令解析 + 模式匹配):使用 shell-quote 库解析命令为 token 数组,再对每个 token 做模式匹配。不使用简单字符串匹配(易被绕过)。

硬阻止列表(绝对禁止执行):
  • rm + 包含 / 的路径参数(阻止删除根/系统目录)
  • sudo / su / doas(提权命令)
  • shutdown / reboot / halt / poweroff
  • curl ... | sh / curl ... | bash / wget ... | sh(远程执行)
  • dd + of=/dev/(写设备文件)
  • mkfs / fdisk(格式化磁盘)
  • chmod 777 / chown 到非当前用户
需确认列表(用户显式确认后执行):
  • eval / exec(动态执行)
  • 修改系统配置文件的命令
  • 安装/卸载软件的命令(apt / brew / npm install -g
  • 网络请求类命令(curl / wget 不含管道)
🔧 实现要求:SandboxManager 中实现 validateCommand(command: string): {allowed: boolean; reason?: string} 方法。使用 shell-quote(npm 包)解析命令,检查每个 token。安全规则配置存储在 app_config 表中(security.commandBlocklist / security.commandConfirmList),用户可在设置界面自定义。

💾 4 个用户级磁盘文件

4 个 .md 文件位于工作空间根目录,是工作空间的必需文件。 其中 SOUL.mdAGENTS.mdUSERS.md 完全由用户自定义,MEMORY.md 由 Agent 维护但用户可编辑。

文件必需注入阶段作用内容来源缺失时处理
SOUL.md静态区(优先)定义 Agent 身份、性格、核心价值观用户自定义自动创建空文件
AGENTS.md静态区定义行为规则、边界、工作流用户自定义自动创建空文件
MEMORY.md动态区跨会话持久记忆Agent 维护 + 用户可编辑自动创建带元数据头的规范文件
USERS.md静态区用户画像:背景、技能、偏好用户自定义自动创建空文件
✅ 自动创建策略:所有必需文件缺失时都会自动创建,不会阻止启动。
SOUL.mdAGENTS.mdUSERS.md:创建空文件,提示用户编辑
MEMORY.md:创建带完整元数据头的规范文件(格式版本、创建时间、工作空间路径)

✨ SOUL.md — AI 灵魂定义

定义 Agent 的身份、性格和核心价值观。加载后注入 System Prompt 的最高优先级静态区。此文件完全由用户自定义,Metona 不提供默认内容。

✨ SOUL.md

~/MetonaWorkspaces/my-project/SOUL.md

用户自定义文件,定义 Agent 的灵魂

📝 用户自定义:SOUL.md 的内容完全由用户决定。Metona 不会预设任何角色、性格或价值观。
用户可以定义任何类型的 Agent:编程助手、写作伙伴、学习导师、虚拟角色等。

推荐结构(仅供参考)

# SOUL.md — 用户自定义 Agent 灵魂

## 身份
# 定义 Agent 是谁:名称、角色、核心特征

## 性格与语气
# 定义 Agent 如何与用户交流:风格、语气、态度

## 核心价值观
# 定义 Agent 的行为准则和底线

SOUL.md 作用域

对象影响
LLM 推理全部轮次注入,决定回复语气、风格和价值观
工具调用影响安全决策和行为边界
记忆存储影响哪些信息被认为值得记忆
错误处理决定错误回复的风格和态度

📋 AGENTS.md — AI 行为定义

定义 Agent 的行为规则、边界、工作流程和工具使用权限。此文件完全由用户自定义,Metona 仅提供内置最小安全规则作为兜底。

📋 AGENTS.md

~/MetonaWorkspaces/my-project/AGENTS.md

用户自定义文件,定义 Agent 行为边界

📝 用户自定义:AGENTS.md 的内容完全由用户决定。Metona 不预设行为规则。
用户可以定义任意复杂度的规则体系,从简单的行为准则到详细的多层规则架构。

推荐结构(仅供参考)

# AGENTS.md — 用户自定义行为规则

## 行为准则
# 定义 Agent 必须遵守的规则

## 工具使用规范
# 定义哪些工具可用、何时需要确认

## 安全边界
# 定义 Agent 的行为底线

## 工作流程
# 定义 Agent 的推理和执行流程

内置最小安全规则(兜底)

🛡 无论 AGENTS.md 如何定义,以下规则始终生效:
  • 不执行明确违法的操作
  • 不泄露用户隐私数据
  • 不可逆操作前必须确认
  • 工具调用失败必须如实报告

AGENTS.md 作用域

对象影响
Agent 决策所有行为受用户定义的规则约束
工具权限定义哪些工具可用、需要确认、被禁用
输出验证根据用户规则验证输出合规性
工作流引导 Agent 的推理和执行流程

🧩 MEMORY.md — AI 记忆文件

跨会话持久记忆。Agent 启动时读取注入上下文,会话结束后自动追加新记忆。此文件有严格的格式规范,Agent 写入时必须遵循,用户编辑时也应遵守。

🧩 MEMORY.md

~/MetonaWorkspaces/my-project/MEMORY.md

Agent 维护 + 用户可编辑的记忆文件

格式规范

📋 强制格式:MEMORY.md 必须遵循以下结构,否则 Agent 写入时会自动修正格式。

创建时的初始模板(自动填充)

当 MEMORY.md 不存在时,Agent 自动创建以下带元数据头的规范文件:

# MEMORY.md — AI 持久记忆
#
# 格式版本: 1.0
# 创建时间: 2026-06-25T12:00:00Z
# 最后更新: 2026-06-25T12:00:00Z
# 工作空间: /home/user/MetonaWorkspaces/my-project
#
# 此文件由 Metona Agent 自动维护,用户可手动编辑。
# 格式规范详见文档,Agent 写入时会自动校验格式。

## 用户偏好
# 格式: - [类别] 内容描述
# 示例: - [沟通风格] 用户喜欢简洁的回答

## 项目上下文
# 格式: - [项目名] 关键信息
# 示例: - [MyApp] 技术栈: React + TypeScript

## 重要决策
# 格式: - YYYY-MM-DD: 决策内容
# 示例: - 2026-06-25: 选择 sql.js 作为数据库方案

## 待办事项
# 格式: - [状态] 任务描述 (状态: pending/done/cancelled)
# 示例: - [pending] 实现用户登录功能

## 已知问题
# 格式: - 问题描述 | 影响范围 | 解决方案
# 示例: - 首次加载慢 | 启动 | 预加载优化

完整示例(有内容时)

# MEMORY.md — AI 持久记忆
#
# 格式版本: 1.0
# 创建时间: 2026-06-25T12:00:00Z
# 最后更新: 2026-06-25T15:30:00Z
# 工作空间: /home/user/MetonaWorkspaces/my-project

## 用户偏好
- [沟通风格] 用户喜欢简洁的回答,不需要过度解释
- [代码风格] 代码块使用 TypeScript 语法高亮
- [工具偏好] 项目使用 pnpm 而非 npm

## 项目上下文
- [MetonaAI-Desktop] 技术栈: React 18 + Electron 28 + TypeScript 5.x
- [MetonaAI-Desktop] 构建工具: Vite + electron-builder

## 重要决策
- 2026-06-20: 选择 sql.js 作为 SQLite 实现
- 2026-06-22: 决定采用四层 Harness 架构

## 待办事项
- [pending] 实现 MCP Server 动态加载
- [done] 完成 Agent Loop 状态机

## 已知问题
- Windows 下 electron-builder 签名需要证书 | 部署 | 使用代码签名证书

格式校验规则

规则说明违反处理
元数据头必须包含 # 格式版本# 创建时间# 最后更新# 工作空间自动补充缺失的元数据
分区结构必须包含 ## 用户偏好## 项目上下文## 重要决策 三个分区自动创建缺失分区
条目前缀每个条目必须以 - 开头,后跟 [类别/标签]自动添加默认标签
日期格式决策条目必须使用 YYYY-MM-DD 格式自动格式化为 ISO 日期
状态标记待办事项必须包含 [pending/done/cancelled] 状态默认标记为 [pending]
时间戳更新每次写入时自动更新 # 最后更新 时间戳自动更新

MEMORY.md 生命周期

1首次创建:文件不存在时自动创建,包含完整元数据头(格式版本、创建时间、工作空间路径)
2启动读取:Agent 初始化时解析 MEMORY.md,校验格式,注入 System Prompt 动态区
3会话中使用:Agent 可通过 memory_search 检索 MEMORY.md 内容
4会话结束后:Agent 自动分析本次会话,按格式规范追加新记忆条目,更新时间戳
5格式校验:每次写入前校验格式,不合规内容自动修正
6用户编辑:用户可随时编辑,Agent 下次启动时重新校验格式
💡 格式保护:Agent 写入 MEMORY.md 时会严格遵循格式规范。 如果用户手动编辑导致格式不合规,Agent 会在下次启动时提示并尝试自动修正,不会丢失已有内容。

MEMORY.md 与 SQLite 记忆系统的关系

MEMORY.md 磁盘文件与 SQLite 数据库中的记忆表是互补关系,各有明确职责:

维度MEMORY.md(磁盘文件)SQLite memories(数据库)
定位用户可读可编辑的跨会话记忆摘要结构化记忆存储,支持检索/评分/过期
格式Markdown,有严格格式规范结构化表(episodic_memories / semantic_memories / working_memories)
谁写入Agent 会话结束后追加 + 用户手动编辑Agent 运行时通过 memory_store 工具写入
谁读取Agent 启动时解析,注入 System PromptAgent 运行时通过 memory_search 检索
检索方式全量注入上下文(不检索)关键词/语义检索,按相关性排序
🔄 同步策略:
Agent 启动时:读取 MEMORY.md → 解析 → 注入 System Prompt 动态区(不写入 SQLite)
Agent 运行时:memory_store / memory_search 操作 SQLite(不读写 MEMORY.md)
会话结束后:Agent 从 SQLite 提取本次会话的重要记忆 → 追加到 MEMORY.md(按格式规范)
用户编辑后:下次启动时 Agent 重新解析 MEMORY.md,不回写 SQLite
Source of Truth:MEMORY.md 是用户可见的“记忆摘要”,SQLite 是 Agent 运行时的“记忆工作区”。两者不强制实时同步,通过启动读取 + 会话结束追加实现单向流动。

👤 USERS.md — 用户信息画像

定义用户的背景、技能、偏好和当前目标。Agent 据此调整回答深度、技术栈偏向和交互风格。此文件完全由用户自定义。

👤 USERS.md

~/MetonaWorkspaces/my-project/USERS.md

用户自定义文件,描述用户画像

📝 用户自定义:USERS.md 的内容完全由用户决定。Metona 不预设任何用户信息。
用户可以描述自己的背景、技能、偏好、目标等,帮助 Agent 更好地理解和服务用户。

推荐结构(仅供参考)

# USERS.md — 用户自定义画像

## 基本信息
# 称呼、角色、经验等

## 技术栈
# 熟悉的技术、工具、框架

## 偏好
# 工具偏好、沟通风格、工作习惯

## 当前目标
# 正在做什么、想要达成什么

USERS.md 作用域

对象影响
技术回答根据用户技术栈调整回答深度和示例
工具选择根据用户偏好选择工具和命令
安全策略根据用户角色调整权限级别
语气风格匹配用户的沟通习惯和偏好

🔍 全链路透明可追踪

用户可在任意时刻完整回溯 Agent 的每一步决策过程。所有数据分为三个可见层级:

三层可见性

层级名称存储位置可见内容用户访问方式
L0 UI 实时展示 内存 Thought 过程、ToolCall 参数/结果、最终答案 聊天界面 / TraceViewer 面板
L1 会话日志 logs/session_{id}.jsonl 每轮 ReAct 迭代的完整状态、LLM 原始输入/输出、工具调用详情 直接打开 .jsonl 或内置日志查看器
L2 审计数据库 .metona/agent.db 结构化审计记录:谁(actor)、做了什么(target)、结果(outcome)、耗时 SQLite 浏览器 / 内置控制台

会话日志格式 (.jsonl)

# logs/session_s_abc_20260625T120000Z.jsonl
{"seq":0,"ts":"2026-06-25T12:00:00.000Z","event":"session_start","sessionId":"s_abc","workspace":"/home/user/my-project"}
{"seq":1,"ts":"2026-06-25T12:00:01.000Z","event":"context_built","sessionId":"s_abc","tokens":1240,"ratio":0.01}
{"seq":2,"ts":"2026-06-25T12:00:01.500Z","event":"iteration_start","sessionId":"s_abc","iteration":1}
{"seq":3,"ts":"2026-06-25T12:00:02.100Z","event":"llm_request","sessionId":"s_abc","iteration":1,"provider":"deepseek","model":"deepseek-v4-pro","messages":[...]}
{"seq":4,"ts":"2026-06-25T12:00:03.800Z","event":"llm_response","sessionId":"s_abc","iteration":1,"content":"Thought: 需要读取文件...","finishReason":"tool_calls","usage":{"inputTokens":1240,"outputTokens":85,"totalTokens":1325}}
{"seq":5,"ts":"2026-06-25T12:00:03.810Z","event":"tool_call","sessionId":"s_abc","iteration":1,"tool":"read_file","args":{"file_path":"data.csv"}}
{"seq":6,"ts":"2026-06-25T12:00:03.820Z","event":"tool_result","sessionId":"s_abc","iteration":1,"tool":"read_file","success":true,"durationMs":5,"result":"..."}
{"seq":7,"ts":"2026-06-25T12:00:04.500Z","event":"iteration_end","sessionId":"s_abc","iteration":1,"durationMs":3000}
{"seq":8,"ts":"2026-06-25T12:00:10.000Z","event":"session_end","sessionId":"s_abc","totalIterations":3,"totalTokens":5430,"totalDurationMs":10000}

📝 日志设计

四层日志体系,覆盖从系统级到业务级的全部可观测需求。

日志分层

层级日志类型存储内容
SYS系统日志electron-log 文件进程启动/退出、崩溃堆栈、内存/CPU 异常、更新事件
AGENTAgent 引擎日志logs/agent.log状态转换、迭代计数、超时、压缩触发、错误恢复
TOOL工具执行日志.metona/agent.db (audit_logs)每次工具调用的参数、结果、耗时、权限校验
TRACE全链路追踪logs/session_*.jsonl完整会话记录(见上文),可导出分析

数据库审计表结构

-- .metona/agent.db > audit_logs
CREATE TABLE audit_logs (
    id          INTEGER PRIMARY KEY AUTOINCREMENT,
    session_id  TEXT NOT NULL,         -- 会话 ID
    iteration   INTEGER,                 -- ReAct 迭代轮次
    event_type  TEXT NOT NULL,         -- tool_call | permission_check | error | llm_request | llm_response
    actor       TEXT NOT NULL,         -- 'agent' | 'user' | 'system'
    target      TEXT NOT NULL,         -- 操作对象 (工具名 / 模块名)
    details     TEXT,                    -- JSON 格式详细信息
    outcome     TEXT,                    -- 'success' | 'denied' | 'error'
    duration_ms INTEGER,                 -- 耗时
    created_at  TEXT DEFAULT (datetime('now'))
);

日志级别

级别含义示例
DEBUG开发调试细节State transition: THINKING → PARSING
INFO正常业务流程MCP server 'filesystem' connected with 8 tools
WARN非预期但可恢复Context compression triggered at iteration 15
ERROR需要关注的错误Tool 'web_search' failed: network timeout

🔄 完整交互流程

从用户启动应用到一次完整对话结束的端到端流程。

启动流程

1Electron Main Process 启动 → 初始化日志系统
2选择/创建工作空间 → 校验必需文件(缺失则自动创建)
3连接 SQLite(.metona/agent.db)→ 执行 schema 迁移 → 加载配置
4初始化 Provider Adapter(根据数据库配置选择)
5加载 4 个磁盘文件,构建 System Prompt(空文件不影响启动)
6连接启用的 MCP Servers → 动态加载 MCP 工具
7启动 React UI(Chromium Renderer),Agent 就绪
8(可选)提示用户编辑 SOUL.md / AGENTS.md / USERS.md 以自定义 Agent

对话流程(一次 ReAct 迭代)

1用户在 ChatInput 输入消息 → IPC agent:sendMessage 发送 MetonaRequest
2Context Builder 组装 MetonaContext:System Prompt + 历史 + 记忆 + 工具列表
3Provider Adapter 将 MetonaContext → 外部 API 格式 → 发送 LLM 请求
4流式接收响应 → 转换为 MetonaStreamEvent → 实时推送 UI
5Parser 解析 LLM 输出 → 提取 Thought / ToolCall 或 FinalAnswer
6(如有 ToolCall)Policy Engine 校验权限 → 执行工具 → 收集 MetonaToolResult
7Observation 注入上下文 → 写入审计日志 → 进入下一轮迭代或输出最终答案
8会话结束 → 更新 MEMORY.md + SQLite → 生成 Session Report

IPC 通道总览

以下为核心 Agent 交互通道。完整 IPC 通道列表(含会话管理、MCP 管理、应用工具等)见《构建指南》第八章 IPC 架构,以构建指南为权威定义。

通道方向数据类型用途
agent:sendMessageRenderer → MainMetonaRequest发送用户消息
agent:streamEventMain → RendererMetonaStreamEvent流式推送 LLM 输出
agent:stateChangeMain → RendererAgentLoopState状态机状态变化
agent:abortSessionRenderer → Main{sessionId}用户中断会话
agent:providerSwitchedMain → Renderer{from, to, reason}故障转移通知
db:searchMemoriesRenderer → MainMemorySearchOptionsUI 查询记忆
config:get / config:set双向{key, value}读写配置
💡 完整 IPC 通道分组:构建指南第八章定义了 4 组 IPC 通道:
Agent 交互(6 个):上表所列
会话管理(6 个):sessions:list / create / rename / delete / getMessages / pin
MCP 管理(4 个):mcp:listServers / addServer / removeServer / toggleServer
应用工具(4 个):app:getVersion / getAppDataPath / openExternal / showItemInFolder
所有 IPC 通道均通过 Preload contextBridge 安全暴露,渲染进程无 Node.js 访问权限。

🏗️ MetonaAI-Desktop 架构与交互设计文档

基于: 生产级通用 AI Agent 构建指南 + Metona 内部 IR 标准

版本 v1.1.0 · 2026-06-26